package com.zhonglian.elisa.utils;

import android.text.TextUtils;
import android.widget.ImageView;

import com.zhonglian.elisa.view.d.bean.DbData;

import java.math.BigInteger;

/**
 * public String ka_type;//1整条，2单卡
 * public String sampletype_name;//样本名称 小麦
 * public String name;//名称 AFB1
 * public String batch;//批次 20191112
 * public String unit;//单位 例：ng/mL
 * public String c_center, t_center;//C、T线中心
 * public String c_search_radius, t_search_radius;//C、T线搜索半径
 * public String c_count_radius, t_count_radius;//C、T线计算半径
 * public String jidian1, jidian2, jidian3, jidian4;//基点
 * public List<List<Float>> newCurve;//计算出的结果曲线数据
 * public List<List<Float>> newData;//最小二乘法直线方程,直线一维集合
 * <p>
 * public String dbIds;//定标ID
 * <p>
 * public String cpType;//0定量，1定性
 * public String iType;//选择的计算类型2:C+T、0:T/C、1:C/T
 * //通过计算类型计算出的：C  T  原始值
 * public String cData;// 检测出的数值C（格式1,2,13,42,9）
 * public String tData;// 检测出的数值T（格式1,2,13,42,9）
 * public List<String> cList;//多个数值C集合（格式0下标：1,2,13,42,9 。1下标：32,544,55）
 * public List<String> tList;//多个数值T集合（格式0下标：1,2,13,42,9 。1下标：32,544,55）
 * public List<String> mNongdu;//浓度
 * public List<String> mXiShu;//系数
 * public String ysData;//原始值（格式1,2,13,42,9）
 * <p>
 * <p>
 * //拟合
 * // 0("点对点（线性插值法）");1("样条插值法 曲线拟合");2("对数曲线拟合");3("双曲线模式");4("多项式模式");
 * //5("Logit-Log直线回归");6("Logistic公式两参数");7("Logistic公式四参数"); 8("指数曲线");9("Hill曲线");
 * public String niheType;//选择的拟合类型：
 * public List<Float> niheList;
 * public String niheData;//生成的拟合参数（格式1,2,13,42,9）
 * <p>
 * public String ndDown;// 浓度下限 默认：1.0
 * public String ndTop;// 浓度上限 默认：10.0
 * public String ndNum;//Integer.toHexString(Float.floatToIntBits(0.0f))校准液浓度 默认：0.0
 * public String jiaozhunData;//校准数据 默认：1.0
 * public String jiaozhunPc;//校准偏差 默认：0.05
 * public String yinData;// 定性 - 阴性临界值
 * public String yangData;// 定性 - 阳性临界值
 */
public class QRCodeCreate {//===========Android 进制转换==============
    public static String ELISA_GR = "*ELISA-GR1";//特征头。移动端：*ELISA-GR1   设备端：*ELISA-GR2


    public static void onCreate(DbData dbData, ImageView imageView) {

        // 字符区 字节不限
        String startStr = ELISA_GR;//特征头。移动端：*ELISA-GR1   设备端：*ELISA-GR2
        String splitStr = "|";//间隔符
        String ybType = dbData.sampletype_name;//样本类型
        String ybName = dbData.name;//样本名称
        String ybPiCi = dbData.batch;//样本批次
        String ybDw = dbData.unit;//单位
        LogUtil.iYx(startStr + splitStr + ybType + splitStr + ybName + splitStr + ybPiCi + splitStr + ybDw);

        // 整数区  整形10进制 转 16进制  字节2
        int cCenter = Integer.parseInt(dbData.c_center);// C线中心 默认：50
        int tCenter = Integer.parseInt(dbData.t_center);// T线中心 默认：150
        int cRadius = Integer.parseInt(dbData.c_search_radius);// C线搜索半径 默认：40
        int tRadius = Integer.parseInt(dbData.t_search_radius);// T线搜索半径 默认：20
        int cNumRadius = Integer.parseInt(dbData.c_count_radius);// C线计算半径 默认：24
        int tNumRadius = Integer.parseInt(dbData.t_count_radius);// T线计算半径 默认：24
        int jdNum1 = Integer.parseInt(dbData.jidian1);//基点 默认：20
        int jdNum2 = Integer.parseInt(dbData.jidian2);// 默认：80
        int jdNum3 = Integer.parseInt(dbData.jidian3);// 默认：120
        int jdNum4 = Integer.parseInt(dbData.jidian4);// 默认：180
        String cCenterStr = intToHex(cCenter, 3);//转成16进制
        String tCenterStr = intToHex(tCenter, 3);
        String cRadiusStr = intToHex(cRadius, 3);
        String tRadiusStr = intToHex(tRadius, 3);
        String cNumRadiusStr = intToHex(cNumRadius, 3);
        String tNumRadiusStr = intToHex(tNumRadius, 3);
        String jd1Str = intToHex(jdNum1, 3);
        String jd2Str = intToHex(jdNum2, 3);
        String jd3Str = intToHex(jdNum3, 3);
        String jd4Str = intToHex(jdNum4, 3);
        //String str16 = new BigInteger("temps10字符串", 10).toString(16);
        if ("0".equals(cCenterStr)) cCenterStr = "000";//为了保持字节长度不变
        if ("0".equals(tCenterStr)) tCenterStr = "000";
        if ("0".equals(cRadiusStr)) cRadiusStr = "000";
        if ("0".equals(tRadiusStr)) tRadiusStr = "000";
        if ("0".equals(cNumRadiusStr)) cNumRadiusStr = "000";
        if ("0".equals(tNumRadiusStr)) tNumRadiusStr = "000";
        if ("0".equals(jd1Str)) jd1Str = "000";
        if ("0".equals(jd2Str)) jd2Str = "000";
        if ("0".equals(jd3Str)) jd3Str = "000";
        if ("0".equals(jd4Str)) jd4Str = "000";
        LogUtil.iYx(cCenterStr + splitStr + tCenterStr);

        // 整数区 不转换  字节1
        int jsType = Integer.parseInt(dbData.iType);//计算方式：默认0 - T/C，1 - C/T ，2 - C+T
        int cpType = Integer.parseInt(dbData.cpType);// 0 - 定量  , 1 - 定性
        int niheType = Integer.parseInt(TextUtils.isEmpty(dbData.niheType) ? "0" : dbData.niheType);//选择的拟合类型 默认0-点对点， 1-XXX,2-XXX...

        //浮点区  浮点转16进制  IEEE754 32位 四字节
        String canShu1 = "00000000"; //拟合参数预留10,用不上的默认0（如拟合参数只有6个那么后4个默认0即16进制：00000000）
        String canShu2 = "00000000";
        String canShu3 = "00000000";
        String canShu4 = "00000000";
        String canShu5 = "00000000";
        String canShu6 = "00000000";
        String canShu7 = "00000000";
        String canShu8 = "00000000";
        String canShu9 = "00000000";
        String canShu10 = "00000000";
        //拟合参数10 分别赋值
        if (!TextUtils.isEmpty(dbData.niheData)) {
            String[] nh = dbData.niheData.split(",");
            float position;
            switch (nh.length - 1) {
                case 9:
                    position = Float.parseFloat(nh[9]);
                    canShu10 = Integer.toHexString(Float.floatToIntBits(position));
                case 8:
                    position = Float.parseFloat(nh[8]);
                    canShu9 = Integer.toHexString(Float.floatToIntBits(position));
                case 7:
                    position = Float.parseFloat(nh[7]);
                    canShu8 = Integer.toHexString(Float.floatToIntBits(position));
                case 6:
                    position = Float.parseFloat(nh[6]);
                    canShu7 = Integer.toHexString(Float.floatToIntBits(position));
                case 5:
                    position = Float.parseFloat(nh[5]);
                    canShu6 = Integer.toHexString(Float.floatToIntBits(position));
                case 4:
                    position = Float.parseFloat(nh[4]);
                    canShu5 = Integer.toHexString(Float.floatToIntBits(position));
                case 3:
                    position = Float.parseFloat(nh[3]);
                    canShu4 = Integer.toHexString(Float.floatToIntBits(position));
                case 2:
                    position = Float.parseFloat(nh[2]);
                    canShu3 = Integer.toHexString(Float.floatToIntBits(position));
                case 1:
                    position = Float.parseFloat(nh[1]);
                    canShu2 = Integer.toHexString(Float.floatToIntBits(position));
                case 0:
                    position = Float.parseFloat(nh[0]);
                    canShu1 = Integer.toHexString(Float.floatToIntBits(position));
                    break;
            }
        }
        LogUtil.iYx(canShu1 + splitStr + canShu10);

        String ndDown = Integer.toHexString(Float.floatToIntBits(Float.parseFloat(TextUtils.isEmpty(dbData.ndDown) ? "0" : dbData.ndDown)));// 浓度下限 默认：1.0
        String ndTop = Integer.toHexString(Float.floatToIntBits(Float.parseFloat(TextUtils.isEmpty(dbData.ndTop) ? "0" : dbData.ndTop)));// 浓度上限 默认：10.0
        String ndNum = Integer.toHexString(Float.floatToIntBits(Float.parseFloat(TextUtils.isEmpty(dbData.ndNum) ? "0" : dbData.ndNum)));//校准液浓度 默认：0.0
        String jiaozhunData = Integer.toHexString(Float.floatToIntBits(Float.parseFloat(TextUtils.isEmpty(dbData.jiaozhunData) ? "0" : dbData.jiaozhunData)));//校准数据 默认：1.0
        String jiaozhunPc = Integer.toHexString(Float.floatToIntBits(Float.parseFloat(TextUtils.isEmpty(dbData.jiaozhunPc) ? "0" : dbData.jiaozhunPc)));//校准偏差 默认：0.05
        String yinData = Integer.toHexString(Float.floatToIntBits(Float.parseFloat(TextUtils.isEmpty(dbData.yinData) ? "0" : dbData.yinData)));// 定性 - 阴性临界值
        String yangData = Integer.toHexString(Float.floatToIntBits(Float.parseFloat(TextUtils.isEmpty(dbData.yangData) ? "0" : dbData.yangData)));// 定性 - 阳性临界值

        if ("0".equals(ndDown)) ndDown = "00000000";//为了保持字节长度不变
        if ("0".equals(ndTop)) ndTop = "00000000";
        if ("0".equals(ndNum)) ndNum = "00000000";
        if ("0".equals(jiaozhunData)) jiaozhunData = "00000000";
        if ("0".equals(jiaozhunPc)) jiaozhunPc = "00000000";
        if ("0".equals(yinData)) yinData = "00000000";
        if ("0".equals(yangData)) yangData = "00000000";


        LogUtil.iYx(ndDown + splitStr + ndNum);
        StringBuilder sb = new StringBuilder();
        sb.append(startStr);
        sb.append(splitStr);
        sb.append(ybType);
        sb.append(splitStr);
        sb.append(ybName);
        sb.append(splitStr);
        sb.append(ybPiCi);
        sb.append(splitStr);
        sb.append(ybDw);
        sb.append(splitStr);
        sb.append(cCenterStr);
        sb.append(tCenterStr);
        sb.append(cRadiusStr);
        sb.append(tRadiusStr);
        sb.append(cNumRadiusStr);
        sb.append(tNumRadiusStr);
        sb.append(jd1Str);
        sb.append(jd2Str);
        sb.append(jd3Str);
        sb.append(jd4Str);
        sb.append(splitStr);
        sb.append(jsType);
        sb.append(cpType);
        sb.append(niheType);
        sb.append(splitStr);
        sb.append(canShu1);
        sb.append(canShu2);
        sb.append(canShu3);
        sb.append(canShu4);
        sb.append(canShu5);
        sb.append(canShu6);
        sb.append(canShu7);
        sb.append(canShu8);
        sb.append(canShu9);
        sb.append(canShu10);
        sb.append(ndDown);
        sb.append(ndTop);
        sb.append(ndNum);
        sb.append(jiaozhunData);
        sb.append(jiaozhunPc);
        sb.append(yinData);
        sb.append(yangData);
        //sb.append(splitStr);
        //sb.append("预留Data");

        String str = sb.toString();
        LogUtil.iYx(str);

        imageView.setImageBitmap(ZXingUtils.createQrCode(str));

    }

    /**
     * 默认数据
     *
     * @param dbData
     * @param imageView
     */
    public static void onDefault(DbData dbData, ImageView imageView) {

        // 字符区 字节不限
        String startStr = "*ELISA-GR1";//特征头。移动端：*ELISA-GR1   设备端：*ELISA-GR2
        String splitStr = "|";//间隔符
        String ybType = "小麦";//样本类型
        String ybName = "AFB1";//样本名称
        String ybPiCi = "20191121";//样本批次
        String ybDw = "ng/mL";//单位
        LogUtil.iYx(startStr + splitStr + ybType + splitStr + ybName + splitStr + ybPiCi + splitStr + ybDw);

        // 整数区  整形10转16进制  字节2
        int cCenter = 50;// C线中心 默认：50
        int tCenter = 150;// T线中心 默认：150
        int cRadius = 40;// C线搜索半径 默认：40
        int tRadius = 20;// T线搜索半径 默认：20
        int cNumRadius = 24;// C线计算半径 默认：24
        int tNumRadius = 24;// T线计算半径 默认：24
        int jdNum1 = 20;//基点 默认：20
        int jdNum2 = 80;// 默认：80
        int jdNum3 = 120;// 默认：120
        int jdNum4 = 180;// 默认：180

        String cCenterStr = Integer.toHexString(cCenter);
        String tCenterStr = Integer.toHexString(tCenter);
        String cRadiusStr = Integer.toHexString(cRadius);
        String tRadiusStr = Integer.toHexString(tRadius);
        String cNumRadiusStr = Integer.toHexString(cNumRadius);
        String tNumRadiusStr = Integer.toHexString(tNumRadius);
        String jd1Str = Integer.toHexString(jdNum1);
        String jd2Str = Integer.toHexString(jdNum2);
        String jd3Str = Integer.toHexString(jdNum3);
        String jd4Str = Integer.toHexString(jdNum4);
        //String str16 = new BigInteger("temps10字符串", 10).toString(16);
        LogUtil.iYx(cCenterStr + splitStr + tCenterStr);

        // 整数区 不转换  字节1
        int jsType = 0;//计算方式：默认0 - T/C，1 - C/T ，2 - C+T
        int cpType = 0;// 0 - 定量  , 1 - 定性
        int niheType = 0;//选择的拟合类型 默认0-点对点， 1-XXX,2-XXX...

        //浮点区  浮点转16进制  IEEE754 32位 四字节
        String canShu1 = Integer.toHexString(Float.floatToIntBits(10.0f));//拟合参数预留10,用不上的默认0
        String canShu2 = Integer.toHexString(Float.floatToIntBits(20.0f));//（如拟合参数只有6个那么后4个默认0即16进制：00000000）
        String canShu3 = Integer.toHexString(Float.floatToIntBits(15.0f));
        String canShu4 = Integer.toHexString(Float.floatToIntBits(100.0f));
        String canShu5 = Integer.toHexString(Float.floatToIntBits(20.0f));
        String canShu6 = Integer.toHexString(Float.floatToIntBits(60.0f));
        String canShu7 = Integer.toHexString(Float.floatToIntBits(70.0f));
        String canShu8 = Integer.toHexString(Float.floatToIntBits(80.0f));
        String canShu9 = Integer.toHexString(Float.floatToIntBits(90.0f));
        String canShu10 = Integer.toHexString(Float.floatToIntBits(100.0f));
        LogUtil.iYx(canShu1 + splitStr + canShu10);
        String ndDown = Integer.toHexString(Float.floatToIntBits(1.0f));// 浓度下限 默认：1.0
        String ndTop = Integer.toHexString(Float.floatToIntBits(10.0f));// 浓度上限 默认：10.0
        String ndNum = "00000000";//Integer.toHexString(Float.floatToIntBits(0.0f))校准液浓度 默认：0.0
        String jiaozhunData = Integer.toHexString(Float.floatToIntBits(1.0f));//校准数据 默认：1.0
        String jiaozhunPc = Integer.toHexString(Float.floatToIntBits(0.05f));//校准偏差 默认：0.05
        String yinData = Integer.toHexString(Float.floatToIntBits(1000f));// 定性 - 阴性临界值
        String yangData = Integer.toHexString(Float.floatToIntBits(1000f));// 定性 - 阳性临界值
        LogUtil.iYx(ndDown + splitStr + ndNum);
        StringBuilder sb = new StringBuilder();
        sb.append(startStr);
        sb.append(splitStr);
        sb.append(ybType);
        sb.append(splitStr);
        sb.append(ybName);
        sb.append(splitStr);
        sb.append(ybPiCi);
        sb.append(splitStr);
        sb.append(ybDw);
        sb.append(splitStr);
        sb.append(cCenterStr);
        sb.append(tCenterStr);
        sb.append(cRadiusStr);
        sb.append(tRadiusStr);
        sb.append(cNumRadiusStr);
        sb.append(tNumRadiusStr);
        sb.append(jd1Str);
        sb.append(jd2Str);
        sb.append(jd3Str);
        sb.append(jd4Str);
        sb.append(splitStr);
        sb.append(jsType);
        sb.append(cpType);
        sb.append(niheType);
        sb.append(splitStr);
        sb.append(canShu1);
        sb.append(canShu2);
        sb.append(canShu3);
        sb.append(canShu4);
        sb.append(canShu5);
        sb.append(canShu6);
        sb.append(canShu7);
        sb.append(canShu8);
        sb.append(canShu9);
        sb.append(canShu10);
        sb.append(ndDown);
        sb.append(ndTop);
        sb.append(ndNum);
        sb.append(jiaozhunData);
        sb.append(jiaozhunPc);
        sb.append(yinData);
        sb.append(yangData);
        //sb.append(splitStr);
        //sb.append("预留Data");

        String str = sb.toString();
        LogUtil.iYx(str);

        imageView.setImageBitmap(ZXingUtils.createQrCode(str));

    }


    /**
     * 10转16 指定size字节,
     * size=2:255(FF)以下数字都会是2字节
     * size=3:4095(FFF)以下数字都会是3字节
     *
     * @param n
     * @param size
     * @return
     */
    private static String intToHex(int n, int size) {
        StringBuffer s = new StringBuffer();
        String a;
        char[] b = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        while (n != 0) {
            s = s.append(b[n % 16]);
            n = n / 16;
        }
        a = s.reverse().toString();
        a = add_zore(a, size);
        return a;
    }

    private static String add_zore(String str, int size) {
        if (str.length() < size) {
            str = "0" + str;
            str = add_zore(str, size);
            return str;
        } else {
            return str;
        }
    }

    /**
     * 反解：将二维码数据解析
     *
     * @param str
     * @return
     */
    public static DbData onAnalysis(String str) {
        DbData dbData = new DbData();
        try {
            String[] sd = str.split("\\|");
            if (sd.length > 0) {
                dbData.sampletype_name = sd[1];//土豆
                dbData.name = sd[2];//S1234
                dbData.batch = sd[3];//20201202
                dbData.unit = sd[4];//ng/ml
                //16-10整，C T数据
                String str1 = sd[5];//000 000 000 000 000
                String[] ct = new String[10];
                char[] chars = str1.toCharArray();
                for (int s = 0; s < chars.length; s = s + 3) {
                    String temps16 = "" + chars[s] + chars[s + 1] + chars[s + 2];//16进制的2位字符串如:C31
                    String str10 = new BigInteger(temps16, 16).toString(10);//解析成10进制如：127
                    ct[s / 3] = str10;
                }
                dbData.c_center = ct[0];//CT 中心
                dbData.t_center = ct[1];
                dbData.c_search_radius = ct[2];//CT搜索半径
                dbData.t_search_radius = ct[3];
                dbData.c_count_radius = ct[4];//CT计算半径
                dbData.t_count_radius = ct[5];
                dbData.jidian1 = ct[6];//基点
                dbData.jidian2 = ct[7];
                dbData.jidian3 = ct[8];
                dbData.jidian4 = ct[9];
                //类型
                String intStr = sd[6];
                dbData.iType = intStr.substring(0, 1);
                dbData.cpType = intStr.substring(1, 2);
                dbData.niheType = intStr.substring(2, intStr.length() - 1);
                //参数
                String str2 = sd[7];
                String[] cs = new String[20];
                char[] chars2 = str2.toCharArray();
                for (int i = 0; i < chars2.length; i = i + 8) {
                    String temps16 = str2.substring(i, i + 8);  //16进制的8位字符串如:00000000
                    BigInteger bi = new BigInteger(temps16, 16);
                    float floatValue = Float.intBitsToFloat(bi.intValue());//解析成10进制如：421.1241
                    cs[i / 8] = floatValue + "";
                }
                //10个参数
                dbData.niheData = "";
                for (int i = 0; i < 10; i++) {
                    if ("0".equals(cs[i]) || "00000000".equals(cs[i])) {
                        break;
                    }
                    if (i < 9) {
                        dbData.niheData += cs[i] + ",";
                    } else {
                        dbData.niheData += cs[i];
                    }
                }
                //其他参数
                dbData.ndDown = cs[10];// 浓度下限 默认：1.0
                dbData.ndTop = cs[11];// 浓度上限 默认：10.0
                dbData.ndNum = cs[12];//校准液浓度 默认：0.0
                dbData.jiaozhunData = cs[13];//校准数据 默认：1.0
                dbData.jiaozhunPc = cs[14];//校准偏差 默认：0.05
                dbData.yinData = cs[15];// 定性 - 阴性临界值
                dbData.yangData = cs[16];// 定性 - 阳性临界值
            }
        } catch (Exception e) {
            ToastUtils.showToastApplication("QRCode - DATA ERROR");
        }
        return dbData;
    }

    /**
     * 整形10进制 转 16进制  字节2
     *  int cCenter = Integer.parseInt("50");
     *  String cCenterStr = Integer.toHexString(cCenter);//转成16进制
     *
     * 16进制转10进制（正数）
     *  String sixteen = "A6";
     *  int ten = Integer.parseInt(sixteen, 16);
     *
     *
     * 浮点转16进制  IEEE754 32位 四字节
     *  String ndDown = Integer.toHexString(Float.floatToIntBits(Float.parseFloat("2.2")));
     *
     * 16进制转回10进制，浮点(可为负数浮点)
     *  BigInteger bi = new BigInteger(hexValue, 16);
     *  Float floatValue = Float.intBitsToFloat(bi.intValue());
     *
     * 二进制转10进制
     *  String two = "0001";
     *  int ten = Integer.parseInt(two, 2);
     *
     * 10进制转二进制
     *  int ten = 10;
     *  String two = Integer.toBinaryString(ten);
     *
     * 二进制转16进制
     *  String two = "0001";
     *  int ten = Integer.parseInt(two, 2);
     *  String sixteen = Integer.toHexString(ten);
     *
     * 16进制转二进制
     *  String sixteen = "A6";
     *  int ten = Integer.parseInt(sixteen, 16);
     *  String two = Integer.toBinaryString(ten);
     */


}
